﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;

namespace FasterWPF
{
    public class VerticalPanelComposite : IComposite
    {
        public bool IsGrid()
        {
            return false;
        }

        public void RemoveFromChain(Border bdr) //unhook all the children so they may be re-added later, if desired
        {
            GetContainer<StackPanel>(bdr).Children.Clear();
        }

        public C GetContainer<C>(Border bdr)
    where C : FrameworkElement
        {
            return ((C)(((ContentControl)(bdr.Child)).Content));
        }

        public C GetContainerFromChildContentControl<C>(ContentControl chain) where C : FrameworkElement
        {
            return ((C)(chain.Content));
        }

        public T GetParent<T>(ContentControl sender)
      where T : FrameworkElement
        {
            return (T)((ContentControl)sender).GetParentFromContentControlOfComposite<T>();
        }

        public Panel AddChild<T>(T source, System.Windows.Controls.ContentControl chain, int row, int col, System.Windows.FrameworkElement child)
               where T : FrameworkElement
        {
            StackPanel g = ((StackPanel)(chain.Content));
            g.Children.Add(child);

            return (Panel)g;
        }

        public void AddCompositeToContentControl<T>(T chain, ContentControl contentControl, object settings)
             where T : FrameworkElement
        {
            StackPanel childPanel = new StackPanel();
            childPanel.Orientation = Orientation.Vertical;

             contentControl.Content = childPanel;
        }

        public T GetParentFromChild<T>(FrameworkElement childElement) where T : FrameworkElement
        {
            return (T)((ContentControl)(((StackPanel)((FrameworkElement)childElement.Parent)).Parent)).GetParentFromContentControlOfComposite<T>();
        }

        public System.Windows.Controls.Border GetBorder<T>(System.Windows.FrameworkElement childElement)
        {
           return (Border)((StackPanel)((FrameworkElement)childElement).Parent).Parent.Cast<ContentControl>().Parent;
        }

        public K Get<K, T>(System.Windows.Controls.ContentControl chain, int row, int column)
                where K : UIElement
                where T : FrameworkElement
        {
           return ((K)((StackPanel)chain.Content).Children[column]);
        }

        public UIElementCollection GetChildren(object container)
        {
            return (container as StackPanel).Children;
        }
    }
}
